<?php
/*
 * Что тут происходит?
 *
 * 2. редактирование записи
 *  а) генерация формы со значениями из записи
 *  б) прием измененной формы, валидация, пост-обработка
 *
 */
$this->useClass("Handler_Item");
$this->useClass("Handler_CreateItem");
class Action_Community_EditItem extends Handler_CreateItem
{

	public function process ()
	{
		if (!isset($this->params['id_item'])) {
			return false;
		}

		$aa = &$this->aa;
		$aa->getInfo();
		$aa->getAvailableOperations( $this->params['id_item'] );

		if (!$this->aa->is_granted(array('item_edit'))) {
			$view = $this->rh->views->findByName('accessdnd');
			$view->data = $aa->template_data;
			$this->rh->response->setContent( $view );
			return;
		}

		$this->setupView();


		$data = NULL;

		// получим объект записи
		$data = $this->getOneItem( $this->params['id_item'] );
		$this->setViewVar('edit_mode', 1);

		$aa->checkDeletions( array($this, "shutdown") );

		// подготовим некоторые поля
		$data['post']['author_url'] = $data['platonicaid_author']['url'];

		if (isset($data['post']['tags'])) {
			$tags = array();
			foreach($data['post']['tags'] as $key=>$val) {
				$tag = mb_strtolower($val['title']);
				$tags[$tag] = $val['title'];
			}

			$data['post']['tags'] = implode(",", $tags);
			$data['post']['tags'] = preg_replace( '/[\ \s]+/', ' ', $data['post']['tags'] );
		}

		$this->determineProcessType($this->typeTransform($data['post']['type']));

		// получить инфу о типе документа.
		// менять тип документа не умеем, поэтому в списке доступных типов оставляем лишь текущий.
		$doctypes_options = $this->getDoctypesOptions();
		foreach ($doctypes_options as &$dto) {
			$dto['disabled'] = true;
		}
		$this->fc->setDoctypes($doctypes_options, $this->process_type);

		$this->fc->setData($data['post']);

		$cm = $this->ctx->mm->getModel("Community");
		$community = $cm->getCommunity($aa->acl_data['comity_oid']);
		$this->fc->setSkin($cm->getSkin( $community ));

		$this->createForm();

		$result = $this->process_form->Handle();
		if ($result != false) {
			$this->setViewVar("formcontent", $result);
			$this->rh->response->setContent($this->view);

		} else {
			// прошли валидацию
			// пытаемся сделать постобработку
			$this->processPOSTrequest($data);
			$this->redirectToItem('Запись сохранена');
		}

	} // end of function process

	private function processPOSTrequest($data) {

		$aa = $this->aa;
		$this->ctx->db->begin();

		$form = &$this->process_form;

		// извлечем описание типа документа
		$fields = array_merge($this->ctx->doctypes[ $this->process_type ]['fields'],  $this->ctx->system_fields);

		foreach ($fields as $field_name=>$field_config) {
			$field_values[ $field_name ] = $form->hash[ $field_name ]->model->model_data;
		}

		$field_values['tdi_oid'] = $form->hash["tdi_oid"]->model->model_data;
		$field_values['edited_user_oid'] = $aa->acl_data['user']['user_id'];
		$field_values['edited_dtime'] = date('Y-m-d H:i:s');

		$result = $this->upItem( $this->process_type, $data['post']['oid'], $fields, $field_values );

		if ($result === true) {
			// все круто

			$this->rh->UseClass('RL_ItemRightsLists');
			$rightsLists = new RL_ItemRightsLists($this->aa);

			$rights = $rightsLists->getViewItemRights(
			$field_values['issue_view_rights'],$field_values['issue_comments_rights'],
			$data['post']['posted_by_id']);

//			print '<pre style="text-align: left;">'; print_r( $rights );exit;

			foreach ( $rights as $role_oid=>$setRights ) {
				if ( !empty($setRights) ) {
					$aa->setAcl($data['post']['oid'], $setRights, $role_oid);
				}
			}

			if (!$this->ctx->db->isErrorInTransaction()) {
				$this->setupView('item_up_message');
				$this->setViewVar('item_oid', $data['post']['oid']);

				$this->ctx->db->end();

				// добавим событие об обновлении итема
				$rs = $this->m_oi->get_openid_for_user_by_oid($aa->acl_data['user_id']);
				while ($openid = $rs->next()) {
					$this->ctx->logger->event(new Event(time(), "update_item", $openid['openid'], $data['post']['oid']));
				}

				if ( $this->ctx->rh->use_search ) {
					//$this->hashItem($data['post']);exit;

					include 'includes/workaholic.php';
					Workaholic::addTask(array($this, 'hashItem'), $data['post']);
				}
			} else {
				$this->setViewVar('error_message', 'Ошибка на этапе после пост-процессинга полей. Откат транзакции.');
				$this->ctx->db->rollback();
			}

		} else {
			// какая-то ошибка произошла на пост-обработке полей
			$this->setViewVar('error_message', $result);
			$this->ctx->db->rollback();

			// отрендерим форму заново
			$this->setViewVar('editform', $this->form->Handle(true, NULL, NULL, NULL, $force_parsing));
		}

	}

	public function hashItem( $data ) {
		$this->rh->useClass('Search_Types');
		$searchTypes = new Search_Types($this->rh, $this->ctx->store);

		$parser = $searchTypes->getTypeParser($data['type']);
		if ( false === $parser ) {
			print "Can`t find parser for '{$data['type']}' type.\n";
			return;
		}

		$parser->linkToObject($data['oid']);
		$maked = $parser->makeSearchData($data['oid']);
		if ( !$maked ) {
			print "Can`t index item with '{$data['oid']}' oid.";
			return;
		}

		$parser->cleanWords();
	}
}
